# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：HelloWorld
#   文件名：5.02 函数的参数.py
# 开发时间：2021/3/24 10:19

# 练习1：定义一个函数，求任意3个数的乘积
def fn1(a=1, b=1, c=1):
    print('a = ', a)
    print('b = ', b)
    print('c = ', c)
    print('a * b * c = ', a * b * c)


fn1(2, 2, 25)


# 练习2：定义一个函数，根据不同用户名显示不同的欢迎提示
def fn2(name='default'):
    if name == 'admin':
        print('Welcome Admin!')
    else:
        print('欢迎', name, '光临！')


fn2('admin')
fn2('momo')

# 定义形参时，可以为形参指定默认值
# 指定了默认值之后，如果用户传递实参，则默认值不会起作用
# 如果用户不传递实参，则默认值则会生效

# 实参传递方式
# 位置参数
# 不指定形参传值，按照形参顺序一对一传递

# 关键字参数
# 可以不按照形参顺序传递实参，而直接根据参数名传递参数
fn1(c=25, a=2, b=2)

# 位置参数与关键字参数混合用
# 混合使用位置参数与关键字参数时，必须将位置参数写到前面
# fn1(c=25, 3)
# 结果：SyntaxError: positional argument follows keyword argument
fn1(2, c=25)


# 函数调用时，解析器不会检查实参的类型
# 实参可以传递任意类型的对象
def fn3(d):
    print('d = ', d)
    print('type = ', type(d))


d = 123
d = 'hello'
d = True
d = None
d = [1, 2, 3]
d = {'key': 'value'}
d = {1, 2, 3, 4}
fn3(d)

# 函数中的是局部变量，函数外的是全局变量
def fn4(e):
    # 在参数中对形参e进行赋值，不会影响其他变量如e1
    # e = 30
    # e1是一个列表，尝试根据索引修改列表元素，会影响该对象e1
    e[0] = 0
    print('e = ', e, type(e), id(e))


e1 = [1, 2, 3]
print(e1, type(e1), id(e1))
# fn4(e1)
# 为了避免影响原e1对象，可以用copy()浅复制
fn4(e1.copy())
print(e1, type(e1), id(e1))
